package es.ucm.fdi.pe.practica2.genetico2.cruce;

import java.util.ArrayList;

import es.ucm.fdi.pe.practica2.genetico2.Alumno;
import es.ucm.fdi.pe.practica2.genetico2.CromosomaAlumnos;
/*
 * 
 * 
 * 
 * */
public class CruceOX {

	public void cruce(CromosomaAlumnos padre1, CromosomaAlumnos padre2){
		//puntos de cruce p1 y p2
		int p1 = (int) (Math.random()* (padre1.getN())+1);
		int p2 = (int) (Math.random()* (padre2.getN())+1);
		
		while(p1==p2||p1==0 && p2==padre1.getN()){
			 p1 = (int) (Math.random()* (padre1.getN())+1);
			 p2 = (int) (Math.random()* (padre2.getN())+1);
		}
		
		if(p2<p1){
			int tmp=p1;
			p1=p2;
			p2=tmp;
		}

		try {
			ArrayList<Alumno> genes1 = trozos(padre1.getGruposAlumnos(),padre2.getGruposAlumnos(),p1,p2);
			ArrayList<Alumno> genes2 = trozos(padre2.getGruposAlumnos(),padre1.getGruposAlumnos(),p1,p2);
			padre1.setGruposAlumnos(genes1);
			padre2.setGruposAlumnos(genes2);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	private ArrayList<Alumno> trozos(ArrayList<Alumno> gruposAlumnos1,
			ArrayList<Alumno> gruposAlumnos2, int p1, int p2) throws Exception {
		
		ArrayList<Alumno> genes = new ArrayList<Alumno>(gruposAlumnos1.size());
		genes.clear();
		for(int j=0;j<gruposAlumnos1.size();j++){
			Alumno al = new Alumno(0,5);
			genes.add(al);
		}
		int i; //posicion de insercion
		for(i=p1;i<p2;i++)
			genes.set(i, gruposAlumnos2.get(i));
		int pos = p2 % gruposAlumnos1.size();
		for(i %=gruposAlumnos1.size();i!=p1;i=(i+1)%gruposAlumnos1.size()){
			while(genes.contains(gruposAlumnos1.get(pos))){
				pos=((pos+1) % gruposAlumnos1.size());
			}
			genes.set(i, gruposAlumnos1.get(pos));
			pos=((pos+1) % gruposAlumnos1.size());
		}
		
		return genes;
	}
}
